package cn.szv5.leetcode;

/**
 * Leetcode<p>
 * 整数反转<p>
 * Copyright: Copyright (C) 2022 , Inc. All rights reserved. <p>
 * Company: 阿飞工作室<p>
 *
 * @author Carl
 * @since 2022/3/21 23:19
 */
public class ReverseInteger7 {
    public static void main(String[] args) {
        Solution solution = new ReverseInteger7().new Solution();

        //测试数据
        int[] arr = {123, -123, 120, Integer.MAX_VALUE, Integer.MIN_VALUE};

        for (int i = 0; i < arr.length; i++) {
            int result = solution.reverse(arr[i]);
            System.out.println(arr[i] + " ---- " + result);
        }
    }

    class Solution {
        /**
         * 最优解法 数学解法思路：
         * 1、尝试拿到个位数字
         * 对10取模运算得到个位数字
         * 2、让每一位数字变成个位数字
         * 先除以10，再对10取模得到十位数字
         * 循环上述操作
         * 3、将每一位数字计算累加
         * 将上次累加结果*10+新数字
         * 注意事项：
         * 边界问题：
         * 从低位到高位处理，最高位结束
         * 最高位/10 == 0
         * 最高位%10 == 最高位
         * 数值溢出边界：溢出则返回0
         * 用long类型存放，溢出int则返回0
         * 新整数补充最后一位前判断溢出
         * 细节问题：
         * 首位不为0
         * 符号处理
         *
         * @param x 指定整数
         * @return 反转后的整数，或0
         */
        public int reverse(int x) {
            if (x == Integer.MAX_VALUE || x == Integer.MIN_VALUE) {
                return 0;
            }
            //符号
            int sign = x > 0 ? 1 : -1;
            //无论正负，都当正数处理
            x = x < 0 ? -x : x;
            // 返回结果
            int result = 0;

            // 1.尝试拿个位数字：对10取模运算
            // 2.让每一位数字变成个位数字：先除以10，再对10取模得到十位数字
            int last = 0;
            while ((last = x % 10) != x) {
                // 3.将每一位数字计算累加：将上次累加结果*10+新数字
                result = result * 10 + last;
                x /= 10;
            }
            //最高位单独处理
            if (last != 0) {
                long re = result;
                re = re * 10 + last;
                if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE) {
                    result = 0;
                } else {
                    result = (int)re;
                }
            }

            return result * sign;
        }

    }
}
